package com.mcp.server.utils;

import jakarta.annotation.Resource;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;

@Component
@Slf4j
public class EmailUtils {
    @Resource
    private JavaMailSender javaMailSender;
    /**
     * Spring Mail 配置读取类  该类由Spring提供
     */
    @Resource
    private MailProperties mailProperties;

    /**
     * 发送普通邮件
     *
     * @param subject 邮件标题
     * @param content 邮件内容
     * @param to      目标邮箱
     */
    public void sendEmail(String subject, String content, String to) {
        // 创建邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        // 创建 MimeMessageHelper
        try {
            // 第二个 boolean 参数表示，是否是一个 Multipart 邮件（带有附件）。
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false);
            // 设置邮件发送者
            helper.setFrom(mailProperties.getUsername());
            // 设置邮件内容 第二个参数表示是否是HTML内容
            helper.setText(content);
            // 设置邮件标题
            helper.setSubject(subject);
            // 设置邮件接收者
            helper.setTo(to);
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("发送邮件成功，收件人：{}，主题：{}", to, subject);
        } catch (MessagingException e) {
            log.error("邮件发送失败 失败原因：{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 发送内容为HTML的邮件
     *
     * @param subject 邮件标题
     * @param content 邮件内容
     * @param to      目标邮箱
     */
    public void sendEmailHTML(String subject, String content, String to) {
        // 创建邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        // 创建 MimeMessageHelper
        try {
            // 第二个 boolean 参数表示，是否是一个 Multipart 邮件（带有附件）。
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false);
            // 设置邮件发送者
            helper.setFrom(mailProperties.getUsername());
            // 设置邮件内容 第二个参数表示是否是HTML内容
            helper.setText(content,true);
            // 设置邮件标题
            helper.setSubject(subject);
            // 设置邮件接收者
            helper.setTo(to);
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("发送邮件成功，收件人：{}，主题：{}", to, subject);
        } catch (MessagingException e) {
            log.error("邮件发送失败 失败原因：{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 发送内容为普通文本并且带附件的邮件
     * @param subject 邮件标题
     * @param content 邮件内容
     * @param to 目标邮箱
     * @param attachmentFilename 附件的名称
     * @param file 附件文件
     */
    public void sendEmailMultipart(String subject, String content, String to , String attachmentFilename, File file) {
        // 创建邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        // 创建 MimeMessageHelper
        try {
            // 第二个 boolean 参数表示，是否是一个 Multipart 邮件（带有附件）。
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            // 设置邮件发送者
            helper.setFrom(mailProperties.getUsername());
            // 设置邮件内容 第二个参数表示是否是HTML内容
            helper.setText(content);
            // 设置邮件标题
            helper.setSubject(subject);
            // 设置邮件接收者
            helper.setTo(to);
            // 设置邮件附件 指定附件名称、文件的 Inputstream 流 以及 Content-Type  可以多次调用添加多个
            helper.addAttachment(attachmentFilename,()-> new FileInputStream(file),"application/octet-stream");
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("发送邮件成功，收件人：{}，主题：{}", to, subject);
        } catch (MessagingException  e) {
            log.error("邮件发送失败 失败原因：{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 发送内容为HTMl并且带附件的邮件
     * @param subject 邮件标题
     * @param content 邮件内容
     * @param to 目标邮箱
     * @param attachmentFilename 附件的名称
     * @param file 附件文件
     */
    public void sendEmailMultipartHTML(String subject, String content, String to , String attachmentFilename, File file) {
        // 创建邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        // 创建 MimeMessageHelper
        try {
            // 第二个 boolean 参数表示，是否是一个 Multipart 邮件（带有附件）。
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            // 设置邮件发送者
            helper.setFrom(mailProperties.getUsername());
            // 设置邮件内容 第二个参数表示是否是HTML内容
            helper.setText(content,true);
            // 设置邮件标题
            helper.setSubject(subject);
            // 设置邮件接收者
            helper.setTo(to);
            // 设置邮件附件 指定附件名称、文件的 Inputstream 流 以及 Content-Type  可以多次调用添加多个
            helper.addAttachment(attachmentFilename,()-> new FileInputStream(file),"application/octet-stream");
            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("发送邮件成功，收件人：{}，主题：{}", to, subject);
        } catch (MessagingException  e) {
            log.error("邮件发送失败 失败原因：{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }
}
